package br.urca.controller;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.TimeZone;

import javax.inject.Inject;

import br.com.caelum.vraptor.Controller;
import br.com.caelum.vraptor.Path;
import br.com.caelum.vraptor.Result;
import br.urca.dao.AlunosCursoDAO;
import br.urca.dao.DocumentoEmitidoDAO;
import br.urca.model.AlunoCurso;
import br.urca.model.DocumentoEmitido;
import br.urca.util.ETipoDocumento;

@Controller
public class ValidacaoDocumentosController {
	
	private Result result;
	
	private DocumentoEmitidoDAO mEmitidoDAO;
	private AlunosCursoDAO mCursoDAO;
	
	public ValidacaoDocumentosController(){ }

	@Inject
	public ValidacaoDocumentosController(Result result,
			DocumentoEmitidoDAO mEmitidoDAO, AlunosCursoDAO mCursoDAO) {
		super();
		this.result = result;
		this.mEmitidoDAO = mEmitidoDAO;
		this.mCursoDAO = mCursoDAO;
	}
	
	@Path("/validacao")
	public void index() { }
	
	public void validar(String part01, String part02,
			String part03, String part04) {
		if ((part01 != null) && (part02 != null) && (part03 != null)
				&& (part04 != null)) {
			
			String md5 = part01 + part02 + part03 + part04;
			
			DocumentoEmitido doc = mEmitidoDAO
					.getDocumentoFromMD5(md5);
			if (doc != null) {
				
				SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
				
				AlunoCurso alunoCurso = mCursoDAO
						.buscaPorMatricula(doc.getId().getMatricula());
				
				String tipoDocumento = null;
				
				if ((short) ETipoDocumento.HISTORICO.getTipo() == doc.getId()
						.getTipoDocumento()) {
					tipoDocumento = "HISTÓRICO";
				} else if ((short) ETipoDocumento.DECLARACAO_MATRICULA
						.getTipo() == doc.getId().getTipoDocumento()) {
					tipoDocumento = "DECLARAÇÃO DE MATRÍCULA";
				}
				
				Calendar calendar = getCalendar();
				int comparacaoData = calendar.getTime().compareTo(doc.getValidade());
				
				this.result
						.include(
								(comparacaoData <= 0 ? "mensagem"
										: "mensagemError"),
								(comparacaoData <= 0 ? "Documento válido até dia: "
										: "Documento com validade vencida! ")
										+ sdf.format(doc.getValidade()))
						.include("part01", part01)
						.include("part02", part02)
						.include("part03", part03)
						.include("part04", part04)
						.include("status", (comparacaoData <= 0 ? "DOCUMENTO VÁLIDO" : "VENCIDO"))
						.include("emissao",
								sdf.format(doc.getId().getEmissao()))
						.include("validade", sdf.format(doc.getValidade()))
						.include("md5", doc.getMd5())
						.include("tipoDocumento", tipoDocumento)
						.include("alunoCurso", alunoCurso).redirectTo(this)
						.index();
				
			} else {
				this.result
						.include("mensagemError",
								"Chave de autenticidade inválida!")
						.include("part01", part01).include("part02", part02)
						.include("part03", part03).include("part04", part04)
						.redirectTo(this).index();
			}
			
		} else {
			this.result
					.include("mensagemError",
							"Chave de autenticidade inválida!")
					.redirectTo(this).index();
		}
	}
	
	@Path("/validacao.go")
	public void validate(String md5) {
		if (md5 != null) {
			
			String part01 = md5.substring(0, 8);
			String part02 = md5.substring(8, 16);
			String part03 = md5.substring(16, 24);
			String part04 = md5.substring(24, md5.length());
			
			DocumentoEmitido doc = mEmitidoDAO
					.getDocumentoFromMD5(md5);
			if (doc != null) {
				
				SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
				
				AlunoCurso alunoCurso = mCursoDAO
						.buscaPorMatricula(doc.getId().getMatricula());
				
				String tipoDocumento = null;
				
				if ((short) ETipoDocumento.HISTORICO.getTipo() == doc.getId()
						.getTipoDocumento()) {
					tipoDocumento = "HISTÓRICO";
				} else if ((short) ETipoDocumento.DECLARACAO_MATRICULA
						.getTipo() == doc.getId().getTipoDocumento()) {
					tipoDocumento = "DECLARAÇÃO DE MATRÍCULA";
				}
				
				Calendar calendar = getCalendar();
				int comparacaoData = calendar.getTime().compareTo(doc.getValidade());
				
				this.result
						.include(
								(comparacaoData <= 0 ? "mensagem"
										: "mensagemError"),
								(comparacaoData <= 0 ? "Documento válido até dia: "
										: "Documento com validade vencida! ")
										+ sdf.format(doc.getValidade()))
						.include("part01", part01)
						.include("part02", part02)
						.include("part03", part03)
						.include("part04", part04)
						.include("status", (comparacaoData <= 0 ? "DOCUMENTO VÁLIDO" : "VENCIDO"))
						.include("emissao",
								sdf.format(doc.getId().getEmissao()))
						.include("validade", sdf.format(doc.getValidade()))
						.include("md5", doc.getMd5())
						.include("tipoDocumento", tipoDocumento)
						.include("alunoCurso", alunoCurso).redirectTo(this)
						.index();
				
			} else {
				this.result
						.include("mensagemError",
								"Chave de autenticidade inválida!")
						.include("part01", part01).include("part02", part02)
						.include("part03", part03).include("part04", part04)
						.redirectTo(this).index();
			}
			
		} else {
			this.result
					.include("mensagemError",
							"Chave de autenticidade inválida!")
					.redirectTo(this).index();
		}
	}
	
	private Calendar getCalendar() {
		Calendar calendar = Calendar.getInstance(TimeZone.getDefault());
		calendar.set(Calendar.HOUR_OF_DAY, 0);
	    calendar.set(Calendar.MINUTE, 0);
	    calendar.set(Calendar.SECOND, 0);
	    calendar.set(Calendar.MILLISECOND, 0);
	    return calendar;
	}
	
}
